perm filename DSKDMP.OFA[SS,SYS] blob sn#699564 filedate 1983-02-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00016 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00005 00002	DEBSW DSKDSW DSKDBG KLBOOT NEWDSK OLDDSK FT1DSK EXTNEW NPACKS EXTNEW DEBSW DSKDBG F A B C D E H J K L M N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 PMP IBM DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF
C00010 00003	PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG XBUF XBUF BOOTBG XBUF
C00013 00004	CHLNXM SELERR DSKPAR CORPAR IDLEL IS REQ TRANS PARERR CMDEMP IDLE UNEND NEWST ATTN STMOD CUEND BUSY CHNEND DEVEND UCHK UNXCPT ACTIVE EPAR ECMDEM EIDLE EUNEND ENEWST EATTN ESTMOD ECUEND EBUSY ECHEND EDEVEN EUCHK EUNXCP CUNEND CACTIV CNEWST CSTATU CCMDHO SCMDHO RSTOPL RSTCHN NWCMA BYTE4 CBYTES CHAIN SKMON SKMOFF RCMD WCMD
C00018 00005	C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
C00020 00006	C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
C00029 00007	MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ
C00031 00008	DSKDMP.DMP FORMAT
C00032 00009	LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NODSKD NOSYS
C00037 00010	LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
C00049 00011	FILSET FILSE1 FILSIX FILSI1 RADJ RADJ1
C00051 00012	SEEK SEEK1 SEEK2 SKERR SKRTRY DSKERR DSKER1 WDEV XWAIT XWAIT1 XWRTRY XWRTY2 XWRTB1 XWRTB2 XWERR XWERR1 SETUP
C00055 00013	SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READ1 READ2 READDN READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST BLAST1 RSTC1
C00065 00014	TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1
C00069 00015	CYL1 CYL2 HEAD1 HEAD2 REC1 ADR1 ADR2 ADR3 ADR4 ADR5 CMD1 SKDAT SCDAT SKWCMA SCWCMA XWCMA SNSWC SKCMD SCCMD XCMD NOPCMD SNSCMD RETRYS RXWCMA BCHAIN C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN SNSDAT RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFEXT DEFPPN
C00075 00016	FF
C00076 ENDMK
C⊗;
;DEBSW DSKDSW DSKDBG KLBOOT NEWDSK OLDDSK FT1DSK EXTNEW NPACKS EXTNEW DEBSW DSKDBG F A B C D E H J K L M N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 PMP IBM DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF

;ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS

;"BOOT" means the program that's loaded into 11 memory that runs in response to
;the DS command in KLDCP.
;
;"DSKDMP" means the program that's run by BOOT.  It generally has DDT and a
;file name scanner, etc.

DEBSW←←0		;IF BOOT, 0 FOR PAPER TAPE, 1 FOR DECTAPE WITH EDDT
			;IF DSKDMP, 0 FOR REAL DSKDMP, 1 FOR DSKDMP WITH EDDT
DSKDSW←←1		;0 FOR BOOT, 1 FOR DSKDMP
DSKDBG←←0		;1 FOR BEING ABLE TO LOAD DSKDMP WITH EDDT
KLBOOT←←1		;IF BOOT, 1 FOR KLDCP LOADABLE BOOT, 0 FOR PAPER TAPE
NEWDSK←←1		;KNOWS ABOUT C1 CHANNEL
OLDDSK←←0		;KNOWS ABOUT PETIT CHANNEL
FT1DSK←←1		;1 IF ALL DISK PACKS ARE ON SAME CONTROLLER
EXTNEW←←0		;IF BOOT, 0 FINDS DSKDMP.DMP, 1 FINDS .NEW, 2 FINDS .OLD
KACODE←←0		;1 to include run time checks for KA-10 and KASIM microcode

NPACKS←←8

DEFINE SWLIST <FOR SWITCH IN (DEBSW,DSKDSW,DSKDBG,KLBOOT,OLDDSK,NEWDSK,FT1DSK,EXTNEW)>

DEFINE VALPNT (VAL) <
PRINTS /VAL/
>
PRINTS /SWITCHES ARE:
/

SWLIST <
PRINTS /SWITCH(/
VALPNT (\SWITCH)
PRINTS /) /
>

PRINTS /
TYPE NEW VALUES FOR THESE SYMBOLS, IF ANY, FOLLOWED BY CONTROL-META-LF
/
.INSERT TTY:

SWLIST <
IFDIF <SWITCH><EXTNEW><
IFN SWITCH,<↓SWITCH←←1>
IFE SWITCH,<↓SWITCH←←0>
>;IFDIF
>;SWLIST
IFL EXTNEW,<.FATAL EXTNEW has illegal value, must be 0, 1 or 2.>
IFG EXTNEW-2,<.FATAL EXTNEW has illegal value, must be 0, 1 or 2.>
↓EXTNEW←←EXTNEW

IFN DSKDSW,<KLBOOT←←0>
IFN KLBOOT,<
DEBSW←←0
DSKDBG←←0
>;KLBOOT

IFN DSKDSW,<
TITLE DSKDMP
>;DSKDSW

IFE DSKDSW,<
IFE EXTNEW,<	TITLE BOOT	>
IFE EXTNEW-2,<	TITLE OBOOT	>
IFE EXTNEW-1,<	TITLE NBOOT	>
>;IFE DSKDSW

F←0
A←1
B←2
C←3
D←4
E←5
H←7
J←10
K←11
L←12
M←13
N←14
T←15
TT←16
P←17

HILOC←←135

NUFDWD←←20

IFN DSKDSW,<
;RIGHT HALF F BITS
RBO←←1			;DOING RUBOUT NOW
>;DSKDSW

↓CUADR←←6			;CONTROL UNIT ADDRESS

APR←←0
PI←←4
KLPAG←←10
CCA←←14
TTY←←120
IFN NEWDSK,<
C1A←←140
C1B←←144
>;IFN NEWDSK
DTE0←←200
IFN OLDDSK,<
PMP←←500
IBM←←504
>;IFN OLDDSK

;KL10 PARAMETERS, ETC.
DTFLG←←444		;DTE20 OPERATION COMPLETE FLAG
DTF11←←450		;      FROM 11 ARGUMENT
DTCMD←←451		;      TO 11 COMMAND

IFN KACODE,<
DEFINE SKPKA <CONSO TTY,1B28>	;SKIP IF THIS IS THE KA10
DEFINE SKPKL <CONSZ TTY,1B28>	;SKIP IF THIS IS THE KL10
>;IFN KACODE
IFE KACODE,<
;DEFINE SKPKA <CAI>		;SKIP IF THIS IS THE KA10 (never)
;DEFINE SKPKL <CAIA>		;SKIP IF THIS IS THE KL10 (always)
>;IFE KACODE

DONG11←←20000				;DTE CONO BIT.  REQUEST 11 INTERRUPT
SWEEPB←←200000				;KL10 APR CONI BIT - SWEEP BUSY
PIOFF←←400

IFN DEBSW,<
	LOC 74
	JRST DDT↑
IFN DSKDSW,<
	LOC 140
	274
	FF
	LOWEST
>;DSKDSW
	LOC 300
	JRST DDT
IFE DSKDSW,<
	JRST BOOT
	LOC 100000
>;IFE DSKDSW
IFN DSKDSW,<
	JRST DSKDMP
	LOC 300000
>;DSKDSW
>;DEBSW

IFE DEBSW,<
IFN DSKDSW,<
	LOC 140
	760000		;LOCATION FOR LOADING STARTING AT 274
	FF		;FIRST FREE
	LOWEST		;LOWEST LOCATION USED
	LOC 274
	PHASE 760000
>;DSKDSW
>;DEBSW
;PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG XBUF XBUF BOOTBG XBUF

;WRITE OUT RIM FORMAT BOOT, PNCHGO

IFE DSKDSW,<
IFE KLBOOT,<
IFE DEBSW,<

PTPC←←1
PTR←←104

LOC 200

PNCHGO:	RESET
	MOVE P,[-20,,RIMPDL]
	INIT PTPC,13
	SIXBIT /PTP/
	OBUF,,
	JRST 4,.
	MOVSI C,-RIMLDL
GO1:	MOVE A,RIMLDR(C)
	PUSHJ P,PUNCH
	AOBJN C,GO1
	MOVEI D,0		;INITIALIZE CHECKSUM
	MOVE A,[BOOTBG,,BOOTBG]
	PUSHJ P,PUNCHC
	MOVSI C,BOOTBG
GO2:	MOVE A,BOOTLO(C)
	PUSHJ P,PUNCHC		;PUNCH AND CHECKSUM
	AOBJN C,GO2
	MOVE A,D
	PUSHJ P,PUNCH		;PUNCH OUT CHECKSUM
	MOVE A,[JRST BOOT]
	PUSHJ P,PUNCH
	MOVEI A,0
	PUSHJ P,PUNCH
	EXIT

PUNCHC:	ROT D,1
	ADD D,A
PUNCH:	SOSG OBUF+2
	OUT PTPC,
	CAIA
	JRST 4,.
	IDPB A,OBUF+1
	POPJ P,

RIMLDR:	-17,,0			;IOWD TO RIM LOADER
	CONO PTR,60
	HRRI 11,4
	CONSO PTR,10
	JRST 3
	ROT 0,-2(11)
	DATAI PTR,@10(11)
	XCT 10(11)
	XCT 13(11)
	SOJA 11,0
	CAME 0,17
	ADD 0,(17)
	SKIPL 17,0
	JRST 4,1
	AOBJN 17,3
	JRST 2
RIMLDL←←.-RIMLDR

RIMPDL:	BLOCK 20
OBUF:	BLOCK 3

LIT
VAR

LOC 1000

BOOTLO:
BOOTBG←←777000
PHASE BOOTBG
XBUF←←BOOTBG-4440
>;IFE DEBSW
>;IFE KLBOOT
>;IFE DSKDSW

IFN DEBSW,<
IFE DSKDSW,<
XBUF:	BLOCK 4440
>;IFE DSKDSW
>;IFN DEBSW

IFN KLBOOT,<
IFE DEBSW,<
BOOTBG←←777000			;CHANGE TO 777000 WHEN SOME MEMORY IS UP THERE
	LOC 140
	BOOTBG
	FF
	LOWEST
	LOC 274
	PHASE BOOTBG
XBUF←←BOOTBG-4440
>;IFE DEBSW
>;KLBOOT
;CHLNXM SELERR DSKPAR CORPAR IDLEL IS REQ TRANS PARERR CMDEMP IDLE UNEND NEWST ATTN STMOD CUEND BUSY CHNEND DEVEND UCHK UNXCPT ACTIVE EPAR ECMDEM EIDLE EUNEND ENEWST EATTN ESTMOD ECUEND EBUSY ECHEND EDEVEN EUCHK EUNXCP CUNEND CACTIV CNEWST CSTATU CCMDHO SCMDHO RSTOPL RSTCHN NWCMA BYTE4 CBYTES CHAIN SKMON SKMOFF RCMD WCMD

;PETIT CHANNEL DEFINITIONS

IFN OLDDSK,<
;PMP CONI BITS
;LEFT HALF
CHLNXM←←200000		;CHANNEL NXM
SELERR←←40000		;SELECT ERROR
			;37700 ARE ADDRESS OF CURRENTLY SELECTED DEVICE
DSKPAR←←40		;CONTROL UNIT DETECTED PARITY ERROR (BIT 18 ALSO SET)
CORPAR←←20		;CHANNEL DETECTED PARITY ERROR (BIT 18 ALSO SET)
IDLEL←←10		;CHANNEL IS IDLE
IS←←4			;CHANNEL IS IN INITIAL SELECT STATE
REQ←←2			;CHANNEL IS IN REQUEST STATE
TRANS←←1		;CHANNEL IS IN TRANSFER STATE

;RIGHT HALF
PARERR←←400000		;CHANNEL OR CONTROL UNIT DETECTED PARITY ERROR
CMDEMP←←200000		;COMMAND HOLD EMPTY (OR UNUSUAL END)
IDLE←←100000		;IDLE STATE (SAME AS IDLEL)
UNEND←←40000		;UNUSUAL END (NXM,SELERR,BUSY,UNIT CHECK,DATA CHAIN ERR)
NEWST←←20000		;CHANNEL HAS NEW STATUS
ATTN←←10000		;ATTENTION
STMOD←←4000		;STATUS MODIFIER
CUEND←←2000		;CONTROL UNIT END
BUSY←←1000		;DEVICE BUSY (IF STMOD THEN CU BUSY)
CHNEND←←400		;CHANNEL END
DEVEND←←200		;DEVICE END
UCHK←←100		;UNIT CHECK
UNXCPT←←40		;UNIT EXCEPTION
ACTIVE←←20		;CHANNEL IS REQUESTING AN INTERRUPT

;PMP CONO BITS (ENABLE INTERRUPT CONDITIONS)
EPAR←←400000		;DISK OR CORE PARITY ERROR
ECMDEM←←200000		;COMMAND HOLD EMPTY
EIDLE←←100000		;IDLE
EUNEND←←40000		;UNUSUAL END
ENEWST←←20000		;NEW STATUS
EATTN←←10000		;ATTENTION
ESTMOD←←4000		;STATUS MODIFIER
ECUEND←←2000		;CONTROL UNIT END
EBUSY←←1000		;BUSY
ECHEND←←400		;CHANNEL END
EDEVEN←←200		;DEVICE END
EUCHK←←100		;UNIT CHECK
EUNXCP←←40		;UNIT EXCEPTION

;DATAO PMP,WCMA
;DATAI IBM,MA

;IBM CONO BITS (FOR CLEARING AND RESETTING THE CHANNEL)
CUNEND←←4000		;CLEAR UNUSUAL END
CACTIV←←400		;CLEAR ACTIVE
CNEWST←←200		;CLEAR NEW STATUS
CSTATU←←40		;CLEAR STATUS REGISTER
CCMDHO←←20		;CLEAR COMMAND HOLD LOADED
SCMDHO←←10		;SET COMMAND HOLD LOADED
RSTOPL←←2		;RESET OPL OUT
RSTCHN←←1		;RESET CHANNEL

;IBM DATAO BITS (SETS COMMAND HOLD LOADED AND LOADS COMMAND HOLD)
;17,,740000 ARE THE DEVICE ADDRESS
NWCMA←←20000		;THIS COMMAND NEEDS A WCMA (DOES A MEMORY XFER)
BYTE4←←10000		;4 BYTE MODE
CBYTES←←4000		;COUNT BYTES
CHAIN←←2000		;COMMAND CHAINING
SKMON←←1000		;SKIP IF STATUS MOD ON
SKMOFF←←400		;SKIP IF STATUS MOD OFF
;377 ARE THE COMMAND

RCMD←←6			;READ COMMAND
WCMD←←5			;WRITE COMMAND

>;IFN OLDDSK
;C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK

;C1 CHANNEL DEFINITIONS

IFN NEWDSK,<

;CONO C1A BITS

C1SBI←←400000		;SELECT BUS INTERFACE
  C1RSI←←40000		;RESET INTERFACE
  C1SRUN←←10000		;SET CLOCK RUN
  C1CONT←←2000		;CONTINUE CLOCK
C1SCH←←200000		;SELECT CHANNEL
  C1RST←←40000		;RESET CHANNEL
  C1CCIF←←20000		;CLEAR CHANNEL INTERRUPT FLAG
  C1INTE←←10000		;INTERRUPT ENABLE
  C1INTD←←4000		;INTERRUPT DISABLE
  C1SCF1←←2000		;SET CF1
  C1CCF1←←1000		;CLEAR CF1
  C1MPCN←←400		;CONTINUE MICROPROCESSOR
  C1LCD←←20		;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
  C1LPT←←11		;LOAD PROGRAM TABLE STARTING ADDRESS
  C1SYSR←←2		;SYSTEM RESET
  C1SCAN←←7		;SCAN PROGRAM TABLE FOR PROGRAMS TO START

C1SDIA←←100000		;SELECT DIAGNOSTIC FUNCTIONS

;CONI C1A BITS

CIF←←4			;CHANNEL INTERRUPT FLAG
CF1←←2			;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1			;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)

C1UCHK←←2		;UNIT CHECK IN IBM STATUS BYTE

>;IFN NEWDSK
;C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST

;C1 CHANNEL DATA AREA PARAMETERS

IFN NEWDSK,<

;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000			;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000			;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000			;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000			;TEST I/O
C1IWC←←010000			;IGNORE WORD COUNT
C1BAK←←004000			;BACKWARDS
C1NATM←←000000			;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000			;BYTE MODE
C1CBYT←←000400			;COUNT BYTES
				;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20			;STOP ON LENGTH ERROR
C1CEC←←10			;CHANNEL END CONTINUE
C1NOC←←2			;NO CHAINING
C1RPT←←1			;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS




;PROGRAM TABLE
C1CCW←←0			;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1			;INTERRUPT SOURCE WORD
   C1PTPE←←100000		;PARITY ERROR IN PROGRAM TABLE
   C1PTNX←←40000		;NXM IN PROGRAM TABLE
   C1IQF←←20000			;INTERRUPT QUEUE FULL
C1PPTR←←2			;FIRST PROGRAM POINTER

;PROGRAM HEADER AND PROGRAM
C1PCW←←0			;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
   C1BW←←100			   ;BUSY WAIT BIT IN PCW
C1STA←←1			;STATUS A
  ;RIGHT HALF BITS
   C1HLT←←400000		;PROGRAM EXECUTED A HALT
   C1LE←←200000			;LENGTH ERROR
   C1SE←←100000			;SELECT ERROR
   C1PE←←040000			;PARITY ERROR
   C1NXM←←020000		;NXM
   C1BPE←←010000		;IBM BUS PARITY ERROR
   C1SSE←←002000		;SIGNAL SEQUENCE ERROR
  ;LEFT HALF BITS
   C1PCMA←←100000		;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2			;STATUS B
C1STC←←3			;STATUS C
C1INST←←4			;FIRST INSTRUCTION OF CHANNEL PROGRAM
>;IFN NEWDSK
;MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ

;FILE SYSTEM PARAMETERS

MFDLOC←←1		;TRACK CONTAINING MFD

TRKCYL←←=19		;19 HEADS PER CYLINDER
CYLPK←←=815		;815 CYLINDERS PER PACK
TRKPK←←TRKCYL*CYLPK	;19*815=15485 TRACKS PER PACK

;RETRIEVAL INFORMATION

NXTQQQ←←0

DEFINE ZWD (A) <
A←←NXTQQQ
NXTQQQ←←NXTQQQ+1
>

	ZWD DDNAM	;FILE NAME
	ZWD DDEXT	;FILE EXTENSION,,DATE WRITTEN,CREATION DATE
	ZWD DDPRO	;PROTECTION,MODE,TIME,DATE WRITTEN
	ZWD DDPPN	;PPN
	ZWD DDLOC	;FIRST DISK ADDRESS OF THIS FILE
	ZWD DDLNG	;LENGTH OF FILE IN WORDS
	ZWD DREFTM
	ZWD DDMPTM
	ZWD DGRP1R	;FIRST USER RCRD NO. THIS GRP
	ZWD DNXTGP	;BLOCK NUMBER OF NEXT GROUP
	ZWD DSATID
	ZWD DQINFO	;START OF SPECIAL STORAGE FOR LOGIN ETC.
NXTQQQ←←NXTQQQ+3
	ZWD DOFFST	;RECORD OFFSET
	ZWD DPTR	;RETRIEVAL DATA, 2 BLK NO.'S/WORD
;DSKDMP.DMP FORMAT

COMMENT ⊗

DSKDMP.DMP[SS,SYS] IS AN ORDINARY DUMP FILE EXCEPT THAT IT HAS BEEN
ASSEMBLED WITH A PHASE STATEMENT AND EXPECTS TO BE LOADED HIGH IN
THE FIRST 256K OF CORE.  LOCATION 140 OF THE CORE IMAGE THAT WOULD
HAVE BEEN OBTAINED BY LOADING DSKDMP CONTAINS THE STARTING ADDRESS
FOR LOADING.  LOCATION 274 IS THE FIRST WORD THAT SHOULD BE LOADED
THERE.  LOCATION 141 CONTAINS THE RELOCATED FIRST FREE ADDRESS, 142
CONTAINS THE RELOCATED LOWEST ADDRESS.  THESE TWO LOCATIONS ARE USED
ONLY BY THE CNVRT PROGRAM TO MAKE DSKDMP.D10

⊗
;LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NODSKD NOSYS

;BOOT BEGINS HERE

IFE DSKDSW,<
LOWEST←←.
BOOT:	CONO APR,200000			;RESET
	SETZM KASIM
IFN KACODE,<
	BLKI APR,A			;GET UCODE OPTIONS INTO BITS 0-8 OF A
	TLNE A,100000			;SKIP UNLESS KA SIMULATION UCODE LOADED
	SETOM KASIM
>;IFN KACODE
	MOVE P,[-LPDL,,PDL-1]
	PUSHJ P,BLAST			;RESET THE CHANNEL
IFN DSKDBG,<
	SKIPE N,SYSLOC
	JRST BOOT1
>;DSKDBG
	MOVEI N,MFDLOC
	MOVE A,[SIXBIT / SSSYS/]
	PUSHJ P,SRCH			;LOOK FOR _SSSYS.UFD IN MFD
	JRST NOSYS
	MOVE N,3(TT)			;GET ADDRESS
IFN DSKDBG,<
	MOVEM N,SYSLOC
>;DSKDBG
BOOT1:	MOVE A,[SIXBIT /DSKDMP/]
IFE EXTNEW,<	MOVSI B,'DMP'	>
IFE EXTNEW-1,<	MOVSI B,'NEW'	>
IFE EXTNEW-2,<	MOVSI B,'OLD'	>
	PUSHJ P,SRCH1			;LOOK FOR DSKDMP.DMP[SS,SYS]
	JRST NODSKD
	MOVE N,3(TT)			;GET DISK ADDRESS OF DSKDMP.DMP[SS,SYS]
	MOVE T,[-240,,XBUF]
	SETZM RECORD
	PUSHJ P,READ0			;READ RETRIEVAL AND ONE RECORD
	MOVE A,XBUF+40+140-74		;GET LOC 140 OF THE DUMP FILE
	MOVE B,XBUF+DDLNG		;GET LENGTH OF DUMP FILE
IFN DSKDBG,<
	MOVE C,XBUF+40+JOBSYM↑-74	;GET POINTER TO SYMBOL TABLE
	ADDI C,-274(A)			;RELOCATE IT
	MOVEM C,SYMPNT
>;DSKDBG
	MOVE C,XBUF+40+JOBSA↑-74	;GET STARTING ADDRESS
	HRRZM C,STARTA
	SUBI B,200
	MOVEM B,LODCNT			;LENGTH OF REMAINDER OF DUMP FILE
	MOVEM A,LODNXT			;STORE ADDRESS TO LOAD INTO
	MOVEI B,2
	MOVEM B,RECORD			;START AT RECORD 2
	MOVE C,[POINT 18,XBUF+DPTR]
	MOVEM C,NXTTRK
	MOVE T,LODCNT
	CAILE T,4400-200
	MOVEI T,4400-200
	JRST BOOTL2

BOOTL1:	MOVE T,LODCNT
	MOVEI N,1
	MOVEM N,RECORD
BOOTL2:	ILDB N,NXTTRK
	CAILE T,4400
	MOVEI T,4400
	MOVEM T,XFRCNT			;SAVE NUMBER OF WORDS THIS TRANSFER
	MOVN T,T			;-NUMBER OF WORDS TO TRANSFER
	HRLZ T,T
	HRR T,LODNXT			;RH GETS NEXT LOC TO LOAD INTO
	PUSHJ P,READ0			;READ REST OF THIS TRACK
	MOVE A,XFRCNT
	ADDM A,LODNXT
	MOVN A,A
	ADDB A,LODCNT
IFN DSKDBG,<
	JUMPLE A,BOOTL3			;ALL DONE
>;DSKDBG
IFE DSKDBG,<
	JUMPLE A,@STARTA		;DONE, TRANSFER TO DSKDMP
>;IFE DSKDBG
	MOVE A,NXTTRK
	CAME A,[POINT 18,XBUF+DPTR+17,35]	;JUST DID LAST TRACK IN GROUP?
	JRST BOOTL1			;NO, DO NEXT TRACK
	MOVE N,XBUF+DNXTGP		;FIRST TRACK OF NEXT GROUP
	PUSHJ P,RDRET			;READ RETRIEVAL
	MOVE A,[POINT 18,XBUF+DPTR]
	MOVEM A,NXTTRK
	JRST BOOTL1

IFN DSKDBG,<
BOOTL3:	SETOM 37
	MOVE A,SYMPNT
	MOVEM A,36
	JRST @STARTA			;JUMP TO STARTING ADDRESS
>;DSKDBG

NODSKD:
IFE EXTNEW,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.DMP[SS,SYS]/]] >
IFE EXTNEW-1,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.NEW[SS,SYS]/]] >
IFE EXTNEW-2,<	SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.OLD[SS,SYS]/]] >
NOSYS:	MOVEI B,[ASCIZ /CAN'T FIND SSSYS.UFD[1,1]/]
	PUSHJ P,TYPE
	JRST 4,.

>;IFE DSKDSW
;LOWEST DSKDMP DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF

;DSKDMP BEGINS HERE

IFN DSKDSW,<
LOWEST←←.
DSKDMP:	MOVE P,[-LPDL,,PDL-1]
	CONO APR,200000
	CONO PI,10000
IFN KACODE,<
	SKPKL
	JRST DSKDM1
>;IFN KACODE
	CONSZ APR,SWEEPB	;WAIT FOR SWEEP BUSY TO FALL
	JRST .-1
	CONSO KLPAG,600000	;IS THE CACHE ON ALREADY?
	JRST DSKDM0		;NO.
	BLKO CCA,		;VALIDATE CORE
	CONSZ APR,SWEEPB
	JRST .-1
DSKDM0:	CONO KLPAG,0		;TURN OFF CACHE.  EPT TO PAGE ZERO.  TURN OFF MAP
	DATAI CCA,0		;SWEEP CACHE.  INVALIDATE ALL.
	CONSZ APR,SWEEPB	;WAIT FOR SWEEP BUSY TO FALL
	JRST .-1
IFN KACODE,<
	BLKI APR,A		;GET UCODE OPTIONS INTO BITS 0-8 OF A
	TLNN A,100000		;SKIP IF KA SIMULATION UCODE LOADED
	JRST DSKDM1
	SETOM KASIM
	CONO KLPAG,0		;MAKE SURE EPT IS AT ZERO
	MOVEI C,411
	PUSHJ P,DTEXX		;TELL KLDCP TO ENTER KASIM MODE
	CONO KLPAG,1000		;MOVE EPT TO PAGE 1000
	PUSHJ P,BLAST
	JRST DSKDM2

>;IFN KACODE
DSKDM1:	PUSHJ P,BLAST
	SETZM KASIM
IFN KACODE,<
	SKPKL
	CONO TTY,3600		;CLEAR ALL BUSY AND DONE FLAGS
	SKIPN KASIM
>;IFN KACODE
	SKIPA B,[SIXBIT /  SSYS/]
DSKDM2:	MOVE B,[SIXBIT /  DSYS/];DIAGNOSTICS LIVE HERE
	MOVEM B,DEFPPN
	MOVEI F,0
	MOVEI B,[ASCIZ /DSKDMP/]
	PUSHJ P,TYPE
IFN KACODE,<
	SKIPN KASIM
	JRST DSKDL
	MOVEI B,[ASCIZ /
KA SIMULATION MICROCODE LOADED
SWITCHES = /]
	PUSHJ P,TYPE
	DATAI APR,B
	PUSHJ P,OCTTYP
>;IFN KACODE
DSKDL:	MOVEI B,[ASCIZ /
*/]
	PUSHJ P,TYPE
	TRZ F,RBO
	MOVEI B,0
DSKDL2:	MOVE A,[010700,,TIBUF-1]
	SETZM TIBUF
	MOVE C,[TIBUF,,TIBUF+1]
	BLT C,TIBUF+TIBFLN-1
DSKDL1:	PUSHJ P,TYI			;GET CHARACTER IN C
	CAIN C,177
	JRST DSKDRO			;RUBOUT
	TRZE F,RBO
	JRST [	PUSH P,C
		MOVEI C,"\"
		PUSHJ P,TYO
		POP P,C
		PUSHJ P,TYO
		CAIE C,15
		JRST .+1
		MOVEI C,12
		PUSHJ P,TYO
		MOVEI C,15
		JRST .+1  ]
	CAIN C,15
	JRST DSKDGO
	CAIN C,33
	JRST DSKDAL			;ALT MODE
	CAIN C,"U"-100
	JRST DSKDL
	IDPB C,A
	JRST DSKDL1

DSKDRO:	CAMN A,[010700,,TIBUF-1]
	JRST DSKDL
	MOVEI C,"\"
	TRON F,RBO			;SET RUBOUT FLAG, SKIP IF ALREADY ON
	PUSHJ P,TYO
	LDB C,A
	PUSHJ P,TYO
	MOVEI C,0
	DPB C,A
	ADD A,[070000,,]
	JUMPGE A,DSKDL1
	SUB A,[430000,,1]
	JRST DSKDL1

DSKDAL:	LDB A,[POINT 7,TIBUF,6]		;GET FIRST CHARACTER
	CAIL A,"0"
	CAILE A,"9"
	CAIA
	JRST SSTRTA			;SET STARTING ADDRESS
	MOVE A,TIBUF
	MOVSI B,-NCMDS
DSKAL1:	CAME A,CMDS(B)
	AOBJN B,DSKAL1
	JUMPL B,DSKDL2			;JUMP IF FOUND ONE (B REMEMBERS THE COMMAND)
	PUSHJ P,QQQ
	JRST DSKDL

QQQ:	MOVEI B,[ASCIZ /  ???/]
	JRST TYPE

DSKDGO:	JUMPE B,LOADGO			;JUST FILE NAME
	JRST @CMDDSP(B)			;DISPATCH ON COMMAND

CMDS:	ASCII /L/			;LOAD
	ASCII /F/			;LIST FILES
	ASCII /D/			;DUMP
	ASCII /K/			;KILL A FILE
	ASCII /G/			;START AT STARTING ADDRESS
	ASCII /M/			;MERGE (LOAD WITHOUT CLEAR)
	ASCII /N/			;LIKE L BUT DOESN'T HACK LOW CORE CELLS
NCMDS←←.-CMDS

CMDDSP:	LOAD
	FILES
	DUMP
	KILL
	START
	MERGE
	NOMUCK

SSTRTA:	MOVE A,[POINT 7,TIBUF]
	MOVEI B,0
SSTRT1:	ILDB C,A
	CAIL C,"0"
	CAILE C,"9"
	JRST SSTRT2
	LSH B,3
	ADDI B,-"0"(C)
	JRST SSTRT1

SSTRT2:	MOVEM B,STARTA
	JRST DSKDL

START:	PUSHJ P,TWAIT			;WAIT FOR TTY TO FINISH
	SKIPE STARTA
	JRST @STARTA
	MOVEI B,[ASCIZ /NO STARTING ADDRESS/]
	PUSHJ P,TYPE
	JRST DSKDL

LOADGO:	SETOM ZERFLG
	SETOM MUCKFL
	PUSHJ P,LOADIT
	JRST DSKDL			;COULDN'T DO IT
	MOVEI B,[ASCIZ / LOADED/]
	PUSHJ P,TYPE
	PUSHJ P,TWAIT
	SKIPE STARTA
	JRST @STARTA			;START IT UP
	MOVEI B,[ASCIZ / BUT NO STARTING ADDRESS/]
	PUSHJ P,TYPE
	JRST DSKDL

NOMUCK:	SETOM ZERFLG
	SETZM MUCKFL
	JRST LOADN

MERGE:	SETZM ZERFLG
	SETOM MUCKFL
	JRST LOADN

LOAD:	SETOM ZERFLG
	SETOM MUCKFL
LOADN:	PUSHJ P,LOADIT
	JRST DSKDL			;COULDN'T DO IT
	MOVEI B,[ASCIZ / LOADED/]
	PUSHJ P,TYPE
	JRST DSKDL

;SKIP RETURNS IF SUCCESSFUL
LOADIT:	PUSHJ P,FILSET			;SET UP FILE NAME
	SKIPN FNAM
	JRST QQQ
	MOVE A,FPPN
	MOVEM A,DEFPPN
	MOVEI N,MFDLOC
	PUSHJ P,SRCH
	JRST NSA			;UFD NOT FOUND IN MFD
	MOVE N,3(TT)			;DISK ADDRESS OF UFD
	MOVE A,FNAM
	HLLZ B,FEXT
	PUSHJ P,SRCH1
	JRST FNF			;FILE NOT FOUND IN UFD
	MOVE N,3(TT)			;DISK ADDRESS OF FILE
	SKIPN ZERFLG
	JRST LDIT0
	SETZM 40
	MOVE A,[40,,41]
	BLT A,DSKDMP-1			;CLEAR CORE UP TO DSKDMP
LDIT0:	MOVE T,[-240,,XBUF]
	SETZM RECORD
	PUSHJ P,READ0			;READ RETRIEVAL AND ONE RECORD
	SETZB C,FHILOC
	SETZM STARTA
	SKIPN MUCKFL			;SKIP IF MUCKING WITH LOW CORE CELLS
	JRST LDIT0A
	MOVE C,XBUF+40+JOBSYM↑-74	;GET POINTER TO SYMBOL TABLE
	MOVEM C,SYMPNT			;SAVE FOR LATER
	MOVE C,XBUF+40+JOBSA↑-74	;GET STARTING ADDRESS
	HRRZM C,STARTA
	MOVE C,XBUF+40+HILOC↑-74	;ADDRESS OF BEGINNING OF UPPER
	MOVEM C,FHILOC
LDIT0A:	MOVE B,XBUF+DDLNG		;GET LENGTH OF DUMP FILE
	JUMPE C,LDIT1			;NO UPPER
	MOVEI B,-74(C)			;FILE SIZE OF LOWER
	SUBI C,1
	IORI C,1777			;LAST ADDRESS OF LOWER
	CAIGE C,377777
	MOVEI C,377777
	ADDI C,1
	MOVEM C,UPPRST			;UPPER STARTS HERE
LDIT1:	MOVEM B,LODCNT
	MOVEI A,74
	MOVEM A,LODNXT			;STORE ADDRESS TO LOAD INTO
	PUSHJ P,LDLP			;LOAD THE LOWER
	SKIPN C,FHILOC			;SKIP IF THERE IS AN UPPER
	JRST LDIT2			;NO UPPER
	MOVE B,XBUF+DDLNG
	SUBI B,-74(C)			;COMPUTE SIZE OF UPPER
	MOVEM B,LODCNT
	MOVE B,UPPRST
	MOVEM B,LODNXT			;STARTING CORE ADDRESS OF UPPER
	MOVE A,RECORD			;NEXT RECORD TO READ IS FIRST REC OF UPPER
	CAIN A,=19
	JRST LDIT3			;UPPER BEGINS ON A TRACK BOUNDARY
	MOVN T,A
	ADDI T,=19			;NUMBER OF RECORDS LEFT IN TRACK
	IMULI T,200			;NUMBER OF WORDS LEFT IN TRACK
	CAMLE T,LODCNT
	MOVE T,LODCNT
	LDB N,NXTTRK
	PUSHJ P,LDLP3
	JRST LDIT2

LDIT3:	MOVE A,NXTTRK
	CAME A,[POINT 18,XBUF+DPTR+17,35]
	JRST LDIT4
	MOVE N,XBUF+DNXTGP
	PUSHJ P,RDRET			;READ RETRIEVAL OF NEXT GROUP
	MOVE A,[POINT 18,XBUF+DPTR]
	MOVEM A,NXTTRK
LDIT4:	PUSHJ P,LDLP1			;LOAD THE UPPER
LDIT2:	MOVEI A,-1
	MOVEM A,37
	MOVE A,SYMPNT
IFN KACODE,<
	SKIPE KASIM
	MOVEI A,116			;PDP-6 DDT EXPECTS 36 TO POINT TO SYM PTR
>;IFN KACODE
	MOVEM A,36
	JRST CPOPJ1

;SET LODNXT TO FIRST LOCATION TO LOAD INTO, LODCNT TO NUMBER OF WORDS TO TRANSFER
;STARTS READING AT THE BEGINNING OF THE GROUP WHOSE RETRIEVAL IS IN XBUF
LDLP:	MOVE C,[POINT 18,XBUF+DPTR]
	MOVEM C,NXTTRK
LDLP1:	MOVE T,LODCNT
	MOVEI N,1
	MOVEM N,RECORD
	ILDB N,NXTTRK
LDLP3:	CAILE T,4400
	MOVEI T,4400
	MOVEM T,XFRCNT			;SAVE NUMBER OF WORDS THIS TRANSFER
	MOVN T,T			;-NUMBER OF WORDS TO TRANSFER
	HRLZ T,T
	HRR T,LODNXT			;RH GETS NEXT LOC TO LOAD INTO
	PUSHJ P,READ0			;READ THE TRACK
	MOVE A,XFRCNT
	ADDM A,LODNXT
	MOVN A,A
	ADDB A,LODCNT
	JUMPLE A,CPOPJ			;DONE
	MOVE A,NXTTRK
	CAME A,[POINT 18,XBUF+DPTR+17,35]	;JUST DID LAST TRACK IN GROUP?
	JRST LDLP1			;NO, DO NEXT TRACK
	MOVE N,XBUF+DNXTGP		;FIRST TRACK OF NEXT GROUP
	PUSHJ P,RDRET			;READ RETRIEVAL
	JRST LDLP

FILES:	MOVEI B,[ASCIZ /FILES COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

DUMP:	MOVEI B,[ASCIZ /DUMP COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

KILL:	MOVEI B,[ASCIZ /KILL COMMAND NOT IMPLEMENTED YET/]
	PUSHJ P,TYPE
	JRST DSKDL

NSA:	MOVEI B,[ASCIZ /NO SUCH AREA - /]
	PUSHJ P,TYPE
	JRST PPNTYP

FNF:	MOVEI B,[ASCIZ /NO SUCH FILE - /]
	PUSHJ P,TYPE
	JRST FILTYP
;FILSET FILSE1 FILSIX FILSI1 RADJ RADJ1

;FILSET

;SCAN TIBUF AND SET UP FILE NAME, EXTENSION AND PPN
FILSET:	MOVE B,DEFPPN
	MOVEM B,FPPN
	MOVE B,DEFEXT
	MOVEM B,FEXT
	SETZM FNAM
	SETZM FEXT+1
	MOVE A,[010700,,TIBUF-1]
	PUSHJ P,FILSIX
	MOVEM B,FNAM
	CAIE D,"."
	JRST FILSE1
	PUSHJ P,FILSIX
	HLLZM B,FEXT
FILSE1:	CAIE D,"["
	POPJ P,
	PUSHJ P,FILSIX
	PUSHJ P,RADJ
	HLLM B,FPPN
	CAIE D,","
	POPJ P,
	PUSHJ P,FILSIX
	PUSHJ P,RADJ
	HLRM B,FPPN
	POPJ P,

FILSIX:	MOVEI B,0
	MOVE C,[440600,,B]
FILSI1:	ILDB D,A		;GET NEXT CHARACTER FROM BUFFER
	CAIE D,"."
	CAIN D,"["
	POPJ P,
	CAIE D,","
	CAIN D,"]"
	POPJ P,
	JUMPE D,CPOPJ
	SUBI D,40
	TLNE C,770000
	IDPB D,C
	JRST FILSI1

RADJ:	JUMPE B,CPOPJ
RADJ1:	TLNE B,77
	POPJ P,
	LSH B,-6
	JRST RADJ1
>;DSKDSW
;SEEK SEEK1 SEEK2 SKERR SKRTRY DSKERR DSKER1 WDEV XWAIT XWAIT1 XWRTRY XWRTY2 XWRTB1 XWRTB2 XWERR XWERR1 SETUP

;SUBROUTINES TO RUN THE DISK   SEEK,XWAIT,SETUP,DSKERR

IFN OLDDSK,<

SEEK:	MOVEI TT,10
	MOVEM TT,ERRCNT
SEEK1:	DATAO PMP,SKWCMA
	DATAO IBM,SKCMD
SEEK2:	CONSO PMP,NEWST!UNEND
	JRST .-1
	CONI PMP,T
	CONO IBM,CNEWST!CUNEND	;OK TO DO THIS HERE SINCE SEEK IS NOT CHAINED
	TRC T,STMOD!UCHK
	TRCN T,STMOD!UCHK
	JRST SKRTRY		;RETRY SEEK
	TRNE T,UNEND
	JRST SKERR		;SEEK ERROR
	TRNN T,DEVEND
	JRST SEEK2		;SPLIT CHN/DEV END, WAIT FOR DEVICE END
	POPJ P,

SKERR:	PUSHJ P,DSKERR		;GET SENSE DATA OUT OF THE WAY IF IT'S A UNIT CHECK
	SOSL ERRCNT
	JRST SEEK1
	MOVEI B,[ASCIZ /CAN'T SEEK/]
	PUSHJ P,TYPE
	JRST 4,.

SKRTRY:	PUSHJ P,XWAIT1		;WAIT FOR DEVICE END
	JRST SEEK1

;GET HERE AFTER DETECTING UNEND.  STATUS IS IN T
DSKERR:	TRNN T,UCHK
	JRST BLAST		;UNUSUAL END OTHER THAN UNIT CHECK
DSKER1:	TRNN T,DEVEND
	PUSHJ P,WDEV		;WAIT FOR DEVICE END
	DATAO PMP,SNSWC
	DATAO IBM,SNSCMD
	CONSO PMP,NEWST
	JRST .-1
	CONI PMP,T
	CONO IBM,CUNEND!CNEWST
	TRNN T,DEVEND
	JRST BLAST
	POPJ P,

WDEV:	CONSO PMP,NEWST
	JRST .-1
	CONI PMP,T
	CONO IBM,CUNEND!CNEWST
	TRNN T,DEVEND
	JRST WDEV
	POPJ P,

XWAIT:	CONSO PMP,NEWST!UNEND
	JRST .-1
	CONI PMP,T
XWAIT1:	TRC T,STMOD!UCHK
	TRCN T,STMOD!UCHK
	JRST XWRTRY
	TRNE T,UNEND
	JRST XWERR			;PROBABLY GOT UNIT CHECK
	CONO IBM,CNEWST!CUNEND
	TRNN T,DEVEND
	JRST XWAIT
	POPJ P,

XWRTRY:	CONO IBM,CCMDHO!CNEWST!CUNEND	;FLUSH EVERYTHING
XWRTY2:	TRNN T,DEVEND
	PUSHJ P,WDEV
	HLRZ T,RETRYS
	XCT XWRTB1(T)			;DATAO PMP,...
	XCT XWRTB2(T)			;DATAO IBM,...
	CONSO PMP,CMDEMP
	JRST .-1
	HRRZ T,RETRYS
	XCT XWRTB1(T)
	XCT XWRTB2(T)
	JRST XWAIT

XWRTB1:	DATAO PMP,SCWCMA
	DATAO PMP,RXWCMA
	JFCL

XWRTB2:	DATAO IBM,SCCMD
	DATAO IBM,XCMD
	DATAO IBM,NOPCMD

XWERR:	SKIPE BCHAIN			;SKIP IF NOT AT START OF COMMAND CHAIN
	TRNN T,UCHK
	JRST XWERR1
	CONO IBM,CCMDHO!CNEWST!CUNEND
	PUSHJ P,DSKER1
	TRZ T,STMOD			;MAKE IT LOOK LIKE A FAILING SEARCH
	POPJ P,

XWERR1:	MOVEI B,[ASCIZ /UNEND AT XWAIT/]
	PUSHJ P,TYPE
	JRST 4,.

SETUP:	SETZM SKDAT
	SETZM SKDAT+1
	SETZM SCDAT
	SETZM SCDAT+1
	IDIVI N,TRKPK			;N←PACK, T←TRACK ON PACK
	IORI N,CUADR⊗4			;DISK DRIVE ADDRESS
	DPB N,ADR1
	DPB N,ADR2
	DPB N,ADR3
	DPB N,ADR4
	DPB N,ADR5
	IDIVI T,TRKCYL			;T←CYLINDER, TT←HEAD
	DPB T,CYL1
	DPB T,CYL2
	DPB TT,HEAD1
	DPB TT,HEAD2
	POPJ P,
>;IFN OLDDSK
;SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READ1 READ2 READDN READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST BLAST1 RSTC1

;SRCH, RDRET, READ, BLAST

;SRCH IS GIVEN A FILENAME IN A AND A TRACK IN N.
;SRCH1 IS GIVEN A FILENAME IN A, AN EXTENSION IN B AND A TRACK IN N
SRCH:	MOVSI B,'UFD'
SRCH1:	PUSHJ P,READ		;READ TRACK N INTO XBUF
	SKIPN T,DDLNG+XBUF	;GET FILE LENGTH
	POPJ P,
	MOVE TT,[POINT 18,DPTR+XBUF,17]
	MOVEM TT,NXTTRK
SRCH2:	MOVE TT,[-4400,,XBUF+40]
SRCH3:	HLLZ C,1(TT)
	CAMN A,(TT)
	CAME B,C
	JRST SRCHLP
	JRST CPOPJ1		;RETURN WITH POINTER IN TT

SRCHLP:	SUBI T,NUFDWD
	JUMPLE T,CPOPJ		;NOT FOUND
	ADD TT,[NUFDWD-1,,NUFDWD-1]
	AOBJN TT,SRCH3
	MOVE TT,NXTTRK
	CAMN TT,[POINT 18,DPTR+XBUF+17,35]	;LAST TRACK IN GROUP?
	JRST SRCH4				;YES
	ILDB N,NXTTRK
SRCH5:	PUSH P,T		;SAVE COUNT OF WORDS LEFT TO SEARCH
	PUSHJ P,READ		;READ IN THE NEXT TRACK
	POP P,T
	JRST SRCH2

SRCH4:	MOVE N,DNXTGP+XBUF	;BLOCK NUMBER OF FIRST TRACK NEXT GROUP
	MOVE TT,[POINT 18,DPTR+XBUF,17]
	MOVEM TT,NXTTRK
	JRST SRCH5

;RDRET READS RETRIEVAL OF TRACK WHOSE ADDRESS IS IN N
;READ READS ENTIRE TRACK WHOSE ADDRESS IS IN N
RDRET:	SKIPA T,[-40,,XBUF]
READ:	MOVE T,[-4440,,XBUF]		;ADDRESS OF BUFFER
	SETZM RECORD			;START READING AT RECORD ZERO
READ0:
IFN NEWDSK,<
	JRST READC1
>;IFN NEWDSK
IFN OLDDSK,<
	MOVEM T,XWCMA
	MOVEM T,RXWCMA			;RETRY XWCMA
	PUSHJ P,SETUP
	MOVE T,RECORD			;GET RECORD NUMBER TO READ FIRST
	DPB T,REC1
	MOVEI T,RCMD
	DPB T,CMD1			;SET COMMAND TO "READ"
	PUSHJ P,SEEK
	SETOM BCHAIN			;INDICATE START OF COMMAND CHAIN
READ1:	DATAO PMP,SCWCMA
	DATAO IBM,SCCMD
	CONSO PMP,CMDEMP
	JRST .-1
	DATAO PMP,XWCMA
	DATAO IBM,XCMD
	MOVEI T,1			;0,,1
	MOVEM T,RETRYS			;SET RETRY STATUS TO SEACH,,READ
	PUSHJ P,XWAIT			;WAIT FOR DEVEND, GET STATUS IN T
	SETZM BCHAIN			;NOT A BEGINNING OF COMMAND CHAIN ANYMORE
	TRNN T,STMOD
	JRST READ1			;SEARCH FAILED, CHAIN TO SEARCH AGAIN
READ2:	AOS T,RECORD
	MOVE T,RCLTAB-1(T)		;GET SIZE OF RECORD IN BOTH HALVES
	ADDB T,XWCMA
	JUMPGE T,READDN			;JUMP IF NO MORE TO READ
	DATAO PMP,XWCMA
	DATAO IBM,XCMD
	MOVE T,[1,,1]			;SET RETRY STATUS TO READ,,READ
	MOVEM T,RETRYS
	PUSHJ P,XWAIT
	MOVE T,XWCMA
	MOVEM T,RXWCMA
	JRST READ2

READDN:	DATAO IBM,NOPCMD		;ISSUE NOP COMMAND TO TERMINATE CHAINING
	MOVE T,[1,,2]			;READ,,NOP
	MOVEM T,RETRYS
	PUSHJ P,XWAIT			;WAIT FOR LAST TRANSFER COMMAND TO FINISH
	MOVE T,[2,,2]
	MOVEM T,RETRYS			;NOP,,NOP IN CASE OF RETRY
	JRST XWAIT			;WAIT FOR NOP TO FINISH AND RETURN
>;IFN OLDDSK
IFN NEWDSK,<
READC1:	PUSHJ P,C1MPIL			;HERE WITH WCMA IN T, COMPILE INTO MRT INST
	PUSH P,T			;SAVE RECORD NUMBER RETURNED BY C1MPIL
	SETZM C1ERR			;CLEAR ERROR COUNT
	IDIVI N,TRKPK			;N←PACK, T←TRACK ON PACK
	IDIVI T,TRKCYL			;T←CYLINDER, TT←HEAD
	DPB T,[POINT 16,C1CCHR,15]	;C C
	DPB TT,[POINT 8,C1CCHR,23]	;H
	MOVE TT,RECORD
	POP P,RECORD
	DPB TT,[POINT 8,C1CCHR,31]	;R
	MOVE TT,C1WCHN(N)		;GET CHANNEL NUMBER
	DPB N,[POINT 4,@C1PPTP(TT),12]	;STORE DISK DRIVE ADDRESS
	MOVEI N,4
	DPB N,[POINT 5,@C1PPTP(TT),4]	;STORE START CODE
C1WAIT:	JUMPN TT,C1WAIB
	CONSO C1A,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1APT+C1ISW
C1WAIA:	TLC T,200000
	TLNE T,600000
	JRST C1WERR
	MOVE T,C1PH+C1STA		;STATUS A WORD
	TRNN T,C1HLT
	JRST C1WERR
	XCT C1CIFI(TT)			;CLEAR INT FLAG
	POPJ P,

C1WAIB:	CONSO C1B,CIF
	JRST .-1
	MOVEI T,0
	EXCH T,C1BPT+C1ISW
	JRST C1WAIA

C1WERR:	AOS T,C1ERR
	CAIL T,=10
	JRST C1DIE
	PUSHJ P,BLAST
	MOVEI T,4
	DPB T,[POINT 5,@C1PPTP(TT),4]		;START C1 AGAIN
	JRST C1WAIT

C1DIE:	MOVEI B,[ASCIZ /C1 ERRORS
/]
	PUSHJ P,TYPE
	JRST 4,.


C1MPIL:	PUSH P,A			;HERE WITH WCMA IN T, 1ST RECORD # IN RECORD
	PUSH P,B
	PUSH P,C
	MOVE A,[-=21,,C1MRTD-1]		;PUSH DOWN POINTER FOR DATA POINTERS
	MOVE B,RECORD
C1MPI1:	HRLZ C,RCLTAB(B)		;GET SIZE OF RECORD
	LSH C,4
	HRR C,T
	TLO C,600000			;MARK AS DATA PNTR AND 1ST OF THE RECORD
	PUSH A,C
	ADD T,RCLTAB(B)
	ADDI B,1			;ADVANCE RECORD NUMBER
	JUMPL T,C1MPI1
	MOVE T,B			;RETURN NEXT RECORD NUMBER IN T
	PUSH A,[0]
	POP P,C
	POP P,B
	POP P,A
	POPJ P,

C1SET:	SETZM C1ZERO
	MOVE A,[C1ZERO,,C1ZERO+1]
	BLT A,C1ZEND-1
	MOVEI A,253
	MOVEM A,C1APT+C1CCW
	MOVEM A,C1BPT+C1CCW
	MOVEI A,C1BW				;BUSY WAIT BIT
	MOVEM A,C1PH
	MOVE A,[C1JMP,,C1MRTC]
	MOVEM A,C1PH+C1INST
	MOVE A,[<BYTE (5)37 (8)CUADR⊗4>!C1PH]
	MOVEM A,C1APT+C1PPTR
	MOVE A,[<BYTE (5)37 (8)<CUADR+1>⊗4>!C1PH]
	MOVEM A,C1BPT+C1PPTR
	POPJ P,
>;IFN NEWDSK

BLAST:
IFN NEWDSK,<
	JRST RSTC1		;RESET CHANNELS
>;IFN NEWDSK
IFN OLDDSK,<
	CONO IBM,CUNEND!CACTIV!CNEWST!CSTATU!CCMDHO
	MOVEI T,3
BLAST1:	MOVEI TT,1000
	CONO IBM,RSTCHN!RSTOPL
	SOJG TT,.
	SOJG T,BLAST1
	POPJ P,
>;IFN OLDDSK

IFN NEWDSK,<
;RESET C1 CHANNELS
RSTC1:	AOSN C1FRST
	PUSHJ P,C1SET				;SET UP C1 DATA AREAS ONCE ONLY
	CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT	;RESET ALL CHANNELS START CLOCK
	CONO C1A,C1SCH!C1RST!C1MPCN		;RESET CHAN A AND START UP
	CONO C1B,C1SCH!C1RST!C1MPCN		;RESET CHAN B AND START UP
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1A TO DO A SYSTEM RESET
	MOVEI A,100000
	CONSZ C1A,CF1				;WAIT FOR IT TO DROP CF1
	SOJG A,.-1
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR	;TELL C1B TOO
	MOVEI A,100000
	CONSZ C1B,CF1
	SOJG A,.-1
	CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT	;INT THE CHANNEL FOR LD ...
	CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT	;...PGM TABLE.
	MOVEI A,100000
	CONSO C1A,CF2			;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
	SOJG A,.-1
	DATAO C1A,C1PTP			;TELL IT WHERE THE PROGRAM TABLE IS
	CONO C1A,C1SCH!C1CCF1		;CLEAR CF1 (TELL IT WE'VE TOLD IT)
	MOVEI A,100000
	CONSZ C1A,CF2			;WAIT FOR CHANNEL TO DROP CF2
	SOJG A,.-1
	MOVEI A,100000
	CONSO C1B,CF2			;REPEAT FOR SECOND CHANNEL
	SOJG A,.-1
	DATAO C1B,C1PTP+1
	CONO C1B,C1SCH!C1CCF1
	MOVEI A,100000
	CONSZ C1B,CF2
	SOJG A,.-1
	POPJ P,
>;IFN NEWDSK
;TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1

;TYPE, TYO, TYI, FILTYP, PPNTYP, TWAIT

TYPE:	HRLI B,440700
TYPE1:	ILDB C,B
	JUMPE C,CPOPJ
	PUSHJ P,TYO
	JRST TYPE1

TYO:	PUSH P,C
	CAIN C,33
	MOVEI C,"$"
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
>;IFN KACODE
	JRST KLTYO
IFN KACODE,<
	CONSZ TTY,20
	JRST .-1
	DATAO TTY,C
	POP P,C
	POPJ P,
>;IFN KACODE

CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,


DTEXX:	MOVEM C,DTCMD
	SETZM DTFLG			;CLEAR 11'S RESPONSE FLAG
	CONO DTE0,DONG11		;RING FOR 11
	SKIPN DTFLG			;WAIT FOR RESPONSE
	JRST .-1
	MOVE C,DTF11			;GET 11'S RESPONSE WORD
	POPJ P,

KLTYO:	ANDI C,177
	PUSHJ P,DTEXX
	POP P,C
	POPJ P,

IFN DSKDSW,<

KLTYI:	MOVEI C,3400
	PUSHJ P,DTEXX
	JUMPE C,KLTYI
	JRST KLTYI1

TYI:
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
>;IFN KACODE
	JRST KLTYI
IFN KACODE,<
	CONSO TTY,40
	JRST .-1
	DATAI TTY,C
>;IFN KACODE
KLTYI1:	ANDI C,177			;FLUSH PARITY BIT
	CAIL C,"a"
	CAILE C,"z"
	CAIA
	SUBI C,40
	CAIE C,176
	CAIN C,175
	MOVEI C,33
	CAIN C,12
	MOVEI C,15
	CAIN C,"U"-100
	JRST TYICAN
	TRNE F,RBO			;SKIP UNLESS RUBBING OUT
	POPJ P,				;DON'T ECHO HERE IF RUBBING OUT
	PUSH P,C
	PUSHJ P,TYO
	CAIE C,15
	JRST POPCJ
	MOVEI C,12
	PUSHJ P,TYO
POPCJ:	POP P,C
	POPJ P,

TYICAN:	MOVEI C,"↑"
	PUSHJ P,TYO
	MOVEI C,"U"
	PUSHJ P,TYO
	MOVEI C,"U"-100
	TRZ F,RBO
	POPJ P,

FILTYP:	MOVE D,FNAM
	PUSHJ P,TYPSIX
	MOVEI C,"."
	SKIPN D,FEXT
	JRST PPNTYP
	PUSHJ P,TYO
	PUSHJ P,TYPSIX
PPNTYP:	MOVEI C,"["
	PUSHJ P,TYO
	HLLZ D,FPPN
	PUSHJ P,TYPSIX
	MOVEI C,","
	PUSHJ P,TYO
	HRLZ D,FPPN
	PUSHJ P,TYPSIX
	MOVEI C,"]"
	JRST TYO

TYPSIX:	MOVEI C,0
	LSHC C,6
	JUMPE C,TYPSI1
	ADDI C,40
	PUSHJ P,TYO
TYPSI1:	JUMPN D,TYPSIX
	POPJ P,

TWAIT:
IFN KACODE,<
	SKPKA
	SKIPE KASIM
	CAIA
	POPJ P,
	CONSZ TTY,20
	JRST TWAIT
>;IFN KACODE
	POPJ P,

OCTTYP:	IDIVI B,10
	JUMPE B,OCTTY1
	HRLM C,(P)
	PUSHJ P,OCTTYP
	HLRZ C,(P)
OCTTY1:	ADDI C,"0"
	JRST TYO
>;DSKDSW
;CYL1 CYL2 HEAD1 HEAD2 REC1 ADR1 ADR2 ADR3 ADR4 ADR5 CMD1 SKDAT SCDAT SKWCMA SCWCMA XWCMA SNSWC SKCMD SCCMD XCMD NOPCMD SNSCMD RETRYS RXWCMA BCHAIN C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN SNSDAT RCLTAB XBUF LPDL LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFEXT DEFPPN

;DISK ADDRESSES AND POINTERS

IFN OLDDSK,<
CYL1:	POINT 16,SKDAT,31
CYL2:	POINT 16,SCDAT,15
HEAD1:	POINT 8,SKDAT+1,15
HEAD2:	POINT 8,SCDAT,31
REC1:	POINT 8,SCDAT+1,7
ADR1:	POINT 8,SKCMD,21
ADR2:	POINT 8,SCCMD,21
ADR3:	POINT 8,XCMD,21
ADR4:	POINT 8,NOPCMD,21
ADR5:	POINT 8,SNSCMD,21
CMD1:	POINT 8,XCMD,35

SKDAT:	0			;0,0,C,C
	0			;0,H,0,0

SCDAT:	0			;C,C,H,H
	0			;R,0,0,0

SKWCMA:	SKDAT
SCWCMA:	SCDAT
XWCMA:	0
SNSWC:	SNSDAT

SKCMD:	NWCMA!BYTE4!7
SCCMD:	CHAIN!SKMOFF!NWCMA!BYTE4!61
XCMD:	CHAIN!NWCMA!6			;CHANGE TO 5 FOR WRITE
NOPCMD:	3
SNSCMD:	NWCMA!CBYTES!BYTE4!4
RETRYS:	0			;RETRY STATUS.  RH = NEW COMMAND, LH = OLD
				;0 → SEARCH, 1 → READ, 2 → NOP
RXWCMA:	0			;PREVIOUS XWCMA FOR RETRY
BCHAIN:	0			;-1 INDICATES BEGINNING OF COMMAND CHAIN
>;IFN OLDDSK

IFN NEWDSK,<
C1ZERO::			;ZERO FROM HERE TO C1ZEND AT DISKUP
C1APT:	BLOCK C1PPTR+1+1	;CHN CTL WD, INT WD, PGM PTR, END MARK
C1BPT:	BLOCK C1PPTR+1+1	;PROGRAM TABLE FOR SECOND CHANNEL
C1PH:	BLOCK C1INST		;PROGRAM HEADER
	0			;JUMP TO PROGRAM

C1ZEND::

C1FRST:	-1			;-1 FIRST TIME THROUGH
C1ERR:	0			;ERROR COUNT

C1PTP:	C1APT			;POINTERS TO PRG TABLES INDEXED BY CHANNEL NUMBER
	C1BPT

C1PPTP:	C1APT+C1PPTR
	C1BPT+C1PPTR

C1CIFI:	CONO C1A,C1SCH!C1CCIF		;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
	CONO C1B,C1SCH!C1CCIF

;WCMAS FOR CONTROL COMMANDS
DEFINE C1WCMA (COUNT,ADDR,REC)<
ZZZ←←0
IFIDN <REC><R><ZZZ←←1>
BYTE (1)1 (1)ZZZ (13)COUNT (22)ADDR
>

C1MRTC:	C1MRT!C1NATM!6,,0		;MRT READ COMMAND
C1CCHR:	BYTE (8)0,0,0,0			;C C H R
	BYTE (8)0,=19-1,0,0		;SECTOR, LAST REC, WRAP REC, 0
	C1JMP,,C1MRTD			;JUMP TO 1ST DATA POINTER
C1MRTD:	BLOCK =19
	0

	'C1WCHN'	;FOR AIDING LOCATING OF THIS TABLE IN CORE FROM DDT
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFN FT1DSK,<
	1
	1
	1
	1
	1
	1
	1
	1
>;IFN FT1DSK
IFE FT1DSK,<
	0
	1
	0
	1
	0
	1
	0
	1
>;IFE FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>
>;IFN NEWDSK


IFN OLDDSK,<
SNSDAT:	BLOCK 6			;24 BYTES OF SENSE INFO
>;IFN OLDDSK

RCLTAB:	40,,40
REPEAT =18,<
	200,,200
>

IFN DSKDSW,<
XBUF:	BLOCK 4440
>;DSKDSW

IFN DSKDSW,<
LPDL←←20
>;IFN DSKDSW
IFE DSKDSW,<
LPDL←←5
>;IFE DSKDSW
PDL:	BLOCK LPDL

ERRCNT:	0
RECORD:	0
NXTTRK:	0			;BYTE POINTER TO DPTR

SYMPNT:	0			;SYMBOL TABLE POINTER FROM DSKDMP.DMP

IFN DSKDBG,<
SYSLOC:	0			;DISK ADDRESS OF SSSYS.UFD[1,1]
PATCH:	BLOCK 40
>;DSKDBG

LODCNT:	0			;NUMBER OF WORDS IN FILE LEFT TO LOAD
LODNXT:	0			;NEXT ADDRESS TO LOAD INTO
XFRCNT:	0			;NUMBER OF WORDS THIS TRANSFER
STARTA:	0			;DSKDMP'S STARTING ADDRESS
KASIM:	0			;-1 IF KA SIMULATION UCODE IS RUNNING

IFN DSKDSW,<
MUCKFL:	0			;-1 IF MUCKING AROUND WITH LOW CORE CELLS
ZERFLG:	0			;-1 TO ZERO CORE FIRST
FHILOC:	0			;HILOC OF FILE WE ARE LOADING
UPPRST:	0			;CORE ADDRESS OF START OF UPPER

TIBFLN←←20
TIBUF:	BLOCK TIBFLN
FNAM:	0
FEXT:	0
	0
FPPN:	0
DEFEXT:	SIXBIT /DMP/		;DEFAULT EXTENSION
DEFPPN:	SIXBIT /  SSYS/		;DEFAULT PPN
>;DSKDSW

;FF

LIT
VAR
FF←←.

IFN DSKDSW,<
IFE DEBSW,<
	END DSKDMP
>;IFE DEBSW
IFN DEBSW,<
	END 300
>;DEBSW
>;DSKDSW

IFE DSKDSW,<
IFE KLBOOT,<
IFN DEBSW,<
	END BOOT
>;DEBSW
IFE DEBSW,<
	END PNCHGO
>;IFE DEBSW
>;IFE KLBOOT
IFN KLBOOT,<
	END BOOT
>;KLBOOT
>;IFE DSKDSW